const Joi = require('joi');
const { objectId } = require('./custom.validator');

/**
 * 获取全部食物列表验证
 */
const getAllFoods = {
  query: Joi.object().keys({
    sortBy: Joi.string().valid('name', 'calories', 'protein', 'fat', 'carbohydrate', 'createdAt').optional(),
    sortOrder: Joi.string().valid('asc', 'desc').optional(),
  }),
};

/**
 * 搜索和筛选食物验证
 */
const searchFoods = {
  query: Joi.object().keys({
    name: Joi.string().optional(),
    nutrient: Joi.string().valid('protein', 'fat', 'carbohydrate', 'fiber', 'sugar', 'sodium', 'cholesterol', 'calories').optional(),
    nutrientMin: Joi.number().min(0).optional(),
    nutrientMax: Joi.number().min(0).optional(),
    isVerified: Joi.boolean().optional(),
    categoryId: Joi.string().custom(objectId).optional(),
    sortBy: Joi.string().valid('name', 'calories', 'protein', 'fat', 'carbohydrate', 'createdAt').optional(),
    sortOrder: Joi.string().valid('asc', 'desc').optional(),
    page: Joi.number().integer().min(1).optional(),
    limit: Joi.number().integer().min(1).max(100).optional(),
  }),
};

/**
 * 根据ID获取食物详情验证
 */
const getFoodById = {
  params: Joi.object().keys({
    foodId: Joi.string().required().custom(objectId),
  }),
};

/**
 * 更新食物分类验证
 */
const updateFoodCategory = {
  body: Joi.object().keys({
    foodId: Joi.string().required().custom(objectId),
    categoryName: Joi.string().required().min(1).max(50),
  }),
};

/**
 * 验证创建食物请求
 */
const createFood = {
  body: Joi.object().keys({
    name: Joi.string().required().min(1).max(100).messages({
      'string.empty': '食物名称不能为空',
      'string.min': '食物名称至少需要1个字符',
      'string.max': '食物名称不能超过100个字符',
      'any.required': '食物名称为必填项'
    }),
    categoryId: Joi.string().required().pattern(/^[0-9a-fA-F]{24}$/).messages({
      'string.empty': '分类ID不能为空',
      'string.pattern.base': '无效的分类ID格式',
      'any.required': '分类ID为必填项'
    }),
    image: Joi.string().allow('').optional().messages({
      'string.empty': '图片URL不能为空字符串'
    }),
    unit: Joi.string().default('克').max(10).messages({
      'string.max': '计量单位不能超过10个字符'
    }),
    calories: Joi.number().required().min(0).max(2000).messages({
      'number.base': '热量必须是数字',
      'number.min': '热量不能小于0',
      'number.max': '热量不能超过2000',
      'any.required': '热量为必填项'
    }),
    nutrition: Joi.object({
      protein: Joi.number().required().min(0).max(100).messages({
        'number.base': '蛋白质含量必须是数字',
        'number.min': '蛋白质含量不能小于0',
        'number.max': '蛋白质含量不能超过100',
        'any.required': '蛋白质含量为必填项'
      }),
      fat: Joi.number().required().min(0).max(100).messages({
        'number.base': '脂肪含量必须是数字',
        'number.min': '脂肪含量不能小于0',
        'number.max': '脂肪含量不能超过100',
        'any.required': '脂肪含量为必填项'
      }),
      carbohydrate: Joi.number().required().min(0).max(100).messages({
        'number.base': '碳水化合物含量必须是数字',
        'number.min': '碳水化合物含量不能小于0',
        'number.max': '碳水化合物含量不能超过100',
        'any.required': '碳水化合物含量为必填项'
      }),
      fiber: Joi.number().optional().min(0).max(50).messages({
        'number.base': '膳食纤维含量必须是数字',
        'number.min': '膳食纤维含量不能小于0',
        'number.max': '膳食纤维含量不能超过50'
      }),
      sugar: Joi.number().optional().min(0).max(100).messages({
        'number.base': '糖分含量必须是数字',
        'number.min': '糖分含量不能小于0',
        'number.max': '糖分含量不能超过100'
      }),
      sodium: Joi.number().optional().min(0).max(5000).messages({
        'number.base': '钠含量必须是数字',
        'number.min': '钠含量不能小于0',
        'number.max': '钠含量不能超过5000'
      }),
      cholesterol: Joi.number().optional().min(0).max(1000).messages({
        'number.base': '胆固醇含量必须是数字',
        'number.min': '胆固醇含量不能小于0',
        'number.max': '胆固醇含量不能超过1000'
      })
    }).required().messages({
      'any.required': '营养成分信息为必填项'
    }),
    isVerified: Joi.boolean().default(false),
    source: Joi.string().optional().max(100).messages({
      'string.max': '数据来源不能超过100个字符'
    })
  })
};

/**
 * 编辑食物分类验证
 */
const editFoodCategory = {
  params: Joi.object().keys({
    categoryId: Joi.string().required().custom(objectId).messages({
      'string.empty': '分类ID不能为空',
      'any.required': '分类ID为必填项'
    }),
  }),
  body: Joi.object().keys({
    name: Joi.string().min(1).max(50).messages({
      'string.empty': '分类名称不能为空',
      'string.min': '分类名称至少需要1个字符',
      'string.max': '分类名称不能超过50个字符'
    }),
    description: Joi.string().allow('').max(200).messages({
      'string.max': '分类描述不能超过200个字符'
    }),
    icon: Joi.string().allow('').max(255).messages({
      'string.max': '图标URL不能超过255个字符'
    }),
    order: Joi.number().integer().min(0).max(10000).messages({
      'number.base': '排序值必须是数字',
      'number.integer': '排序值必须是整数',
      'number.min': '排序值不能小于0',
      'number.max': '排序值不能超过10000'
    }),
    isActive: Joi.boolean().messages({
      'boolean.base': '活跃状态必须是布尔值'
    })
  }).min(1).messages({
    'object.min': '至少需要提供一个更新字段'
  }),
};

/**
 * 删除食物分类验证
 */
const deleteFoodCategory = {
  params: Joi.object().keys({
    categoryId: Joi.string().required().custom(objectId).messages({
      'string.empty': '分类ID不能为空',
      'any.required': '分类ID为必填项'
    }),
  }),
};

/**
 * 创建食物分类验证
 */
const createFoodCategory = {
  body: Joi.object().keys({
    name: Joi.string().required().min(1).max(50).messages({
      'string.empty': '分类名称不能为空',
      'string.min': '分类名称至少需要1个字符',
      'string.max': '分类名称不能超过50个字符',
      'any.required': '分类名称为必填项'
    }),
    description: Joi.string().allow('').max(200).messages({
      'string.max': '分类描述不能超过200个字符'
    }),
    icon: Joi.string().allow('').max(255).messages({
      'string.max': '图标URL不能超过255个字符'
    }),
    order: Joi.number().integer().min(0).max(10000).default(0).messages({
      'number.base': '排序值必须是数字',
      'number.integer': '排序值必须是整数',
      'number.min': '排序值不能小于0',
      'number.max': '排序值不能超过10000'
    }),
    isActive: Joi.boolean().default(true).messages({
      'boolean.base': '活跃状态必须是布尔值'
    })
  }),
};

/**
 * 更新食物分类排序验证
 */
const updateCategoriesOrder = {
  body: Joi.object().keys({
    categories: Joi.array().items(
      Joi.object().keys({
        id: Joi.string().required().custom(objectId).messages({
          'string.empty': '分类ID不能为空',
          'any.required': '分类ID为必填项'
        }),
        order: Joi.number().integer().min(0).required().messages({
          'number.base': '排序值必须是数字',
          'number.integer': '排序值必须是整数',
          'number.min': '排序值不能小于0',
          'any.required': '排序值为必填项'
        })
      })
    ).min(1).required().messages({
      'array.min': '至少需要提供一个分类',
      'any.required': '分类数组为必填项'
    })
  })
};

module.exports = {
  getAllFoods,
  searchFoods,
  getFoodById,
  updateFoodCategory,
  createFood,
  editFoodCategory,
  deleteFoodCategory,
  createFoodCategory,
  updateCategoriesOrder,
};